# -*- coding: utf-8 -*-


"""
目标网站: https://movie.douban.com/top250?&filter=
需求: 翻页获取电影标题以及副标题，电影类型，评分，引言 最后保存在csv文件当中

不考虑标签位置，直接定位对应的标签: //标签名
定位属性:@
定位对应子级标签: /标签名
获取文本内容: text()

查不到标签元素:  xpath语法可能会有问题
类型，翻页
(标签为空):  if判断
容易封ip

翻页:还是先获取第一页的数据
元素当中的数据会跟对应的目标url数据可能不一样
数据提取: 以响应内容为主
确定url: https://movie.douban.com/top250?&filter=

请求方式: get请求
响应数据: html(xpath工具)

[电影标题]
[副标题]
[电影类型]
[评分]

[电影标题，副标题，电影类型，评分，引言]

所有的数据: //div[@class="info"]
电影标题以及副标题: div[@class="hd"]/a/span/text()
类型: div[@class="bd"]/p/text()
评分: div[@class="bd"]/div[@class="star"]/span[2]/text()
引言: div[@class="bd"]/p[@class="quote"]/span/text()

第一页的数据已经拿到
1.翻页(根据url变化， 找到翻页的参数)
https://movie.douban.com/top250?&filter=
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
发生变化的参数:start
第一页: start = 0 (页数-1) * 25 = 0
第二页: start = 1 (页数-1) * 25 = 25
第三页: start = 2 (页数-1) * 25 = 50

page: (page -1) * 25
https://movie.douban.com/top250?start={(page-1)*25}&filter=
"""
import csv

import requests
from lxml import etree
#
lst = []
for page in range(1,11):
    url = f'https://movie.douban.com/top250?start={(page-1)*25}&filter='
    #
    # # 如果短时间内不断地发请求 -- 封ip(先获取源码 -- 保存在html -- 从html文件读取数据，做解析)
    head = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
    }
    #
    res = requests.get(url, headers=head)
    #
    # with open('doubao.html', 'w', encoding='utf-8')as f:
    #     f.write(res.text)

    # 读取数据
    # with open('doubao.html', 'r', encoding='utf-8')as f:
    #     html = f.read()  # 源码数据

    # 数据解析
    result = etree.HTML(res.text)

    # 1. 先获取div=info
    divs = result.xpath('//div[@class="info"]')
    # print(len(divs), divs)
    # 2. 依次拿每一组的数据
    for div in divs:
        dic = {}
        # print(div) # tree.xpath  还是div.xpath
        # . ： 在当前节点操作(div=info)
        # //: 获取a标签下的所有内容(跨标签获取)
        # 标题
        title = div.xpath('./div[@class="hd"]/a/span/text()')  # 返回的数据类型是列表
        dic['titles'] = ''.join(title)  # \xa0  代表的是空白符
        # print(titles)
        # 类型
        p = div.xpath('./div[@class="bd"]/p/text()')
        # 取出前后的空格 -- strip()
        dic['ps'] = ''.join(p).strip().split('/')[-1]
        # print(ps)
        # 评分
        dic['star'] = div.xpath('./div[@class="bd"]/div[@class="star"]/span[2]/text()')[0]
        # print(star)
        # 引言
        """
        IndexError: list index out of range：索引超出，越界
        如果没有获取到数据: 返回的是空列表  判断: 如果是空列表，赋值为空字符  有数据，通过索引取值
        """
        quote = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
        if quote:  # 代表有数据的情况
            dic['quote'] = quote[0]
        else:
            dic['quote'] = ''
        lst.append(dic)

with open('douban.csv', 'w', encoding='utf-8-sig', newline='')as f:
    # 创建csv对象
    writer = csv.DictWriter(f, fieldnames=('titles', 'ps', 'star', 'quote'))
    # 写入标题
    writer.writeheader()
    # 写入数据
    writer.writerows(lst)
